package simpledb.execution;

import simpledb.storage.Field;

import java.io.Serializable;

/**
 * IndexPredicate 用于在有索引的字段上进行条件比较。
 *
 * 它表示一个索引查询条件，包含操作符（如等于、大于等）和要比较的字段值。
 * 主要用于支持基于 B+ 树索引的高效扫描（如范围查找、等值查找）。
 *
 * @see IndexOpIterator
 */
public class IndexPredicate implements Serializable {

    private static final long  serialVersionUID = 1L;

    /**
     * 比较操作符，例如：EQUAL、GREATER_THAN 等
     */
    private final Predicate.Op op;

    /**
     * 要与之比较的字段值
     */
    private final Field        fieldvalue;

    /**
     * 创建一个新的 IndexPredicate 实例。
     *
     * @param fvalue 要比较的字段值
     * @param op     所使用的比较操作符（如 EQUAL、LESS_THAN 等）
     * @see Predicate.Op
     */
    public IndexPredicate(Predicate.Op op, Field fvalue) {
        this.op = op;
        this.fieldvalue = fvalue;
    }

    /**
     * 获取该谓词中要比较的字段值。
     *
     * @return 字段值
     */
    public Field getField() {
        return fieldvalue;
    }

    /**
     * 获取该谓词所使用的比较操作符。
     *
     * @return 操作符
     */
    public Predicate.Op getOp() {
        return op;
    }

    /**
     * 判断两个 IndexPredicate 是否相等。
     *
     * 只有当它们的操作符和字段值都相等时才认为是相等的。
     *
     * @param ipd 待比较的另一个 IndexPredicate
     * @return 如果相等返回 true，否则返回 false
     */
    public boolean equals(IndexPredicate ipd) {
        if (ipd == null)
            return false;
        return (op.equals(ipd.op) && fieldvalue.equals(ipd.fieldvalue));
    }
}
